home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / include / stkmem.h < prev   
C/C++ Source or Header  |  1992-10-23  |  1KB  |  60 lines

  1. #ifndef STKMEM_H
  2. #define STKMEM_H
  3.  
  4. #ifdef USE_ALLOCA
  5.  
  6. #ifdef INCLUDE_ALLOCA_H
  7. #  include <alloca.h>
  8. #endif
  9.  
  10. /* #pragma must be indented to prevent some C-compilers from complaining
  11.  * about "undefined control".
  12.  */
  13. #ifdef PRAGMA_ALLOCA
  14.    #pragma alloca
  15. #endif
  16.  
  17. #if !defined(alloca) && !defined(__GNUC__)
  18. C_LINKAGE_BEGIN
  19. extern char *alloca P_((int));
  20. C_LINKAGE_END
  21. #endif
  22.  
  23. /* MIPS cc under Ultrix 4.2 requires argument to alloca() to be
  24.  * parenthesized if it's a compound expression:
  25.  */
  26. #define Alloca_Begin extern _unused   /* must expand to valid declaration */
  27. #define Alloca(ret,type,size) ((ret) = (type)alloca((size)))
  28. #define Alloca_End
  29.  
  30. #else /* USE_ALLOCA */
  31.  
  32. #define Alloca_Begin MEM_NODE *_mem_first = 0
  33. #define Alloca(ret,type,size) {\
  34.     register MEM_NODE *_p;\
  35.     _p = (MEM_NODE*)Mem_Alloc ((unsigned)(size) + sizeof(MEM_NODE));\
  36.     _p->next = Mem_List;\
  37.     _p->len = (size);\
  38.     _p->refcnt = 1;\
  39.     Mem_List = _p;\
  40.     if (_mem_first == 0) _mem_first = _p;\
  41.     (ret) = (type)(_p+1);\
  42. }
  43. #define Alloca_End {\
  44.     register MEM_NODE *_p, *_q;\
  45.     if (_mem_first != 0) {\
  46.     _p = Mem_List;\
  47.     do {\
  48.         _q = _p;\
  49.         _p = _p->next;\
  50.         if (--_q->refcnt == 0)\
  51.         free ((char *)_q);\
  52.     } while (_q != _mem_first);\
  53.     Mem_List = _p;\
  54.     }\
  55. }
  56.  
  57. #endif
  58.  
  59. #endif
  60.